﻿using System.Runtime;
using System.Globalization;

namespace System.Reflection
{
    [NonScript]
    public abstract class MethodBase : MemberInfo
    {
        public abstract RuntimeMethodHandle MethodHandle { get; }

        public abstract MethodAttributes Attributes { get; }

        public virtual CallingConventions CallingConvention
        {
            get { return CallingConventions.Standard; }
        }

        public virtual bool IsGenericMethodDefinition
        {
            get { return false; }
        }

        public virtual bool ContainsGenericParameters
        {
            get { return false; }
        }

        public virtual bool IsGenericMethod
        {
            get { return false; }
        }

        public virtual bool IsSecurityCritical
        {
            get { return false; }
        }

        public virtual bool IsSecuritySafeCritical
        {
            get { return false; }
        }

        public virtual bool IsSecurityTransparent
        {
            get { return false; }
        }

        public bool IsPublic
        {
            get { return false; }
        }

        public bool IsPrivate
        {
            get { return false; }
        }


        public bool IsFamily
        {
            get { return false; }
        }


        public bool IsAssembly
        {
            get { return false; }
        }

        public bool IsFamilyAndAssembly
        {
            get { return false; }
        }

        public bool IsFamilyOrAssembly
        {
            get { return false; }
        }
        public bool IsStatic
        {
            get { return false; }
        }

        public bool IsFinal
        {
            get { return false; }
        }

        public bool IsVirtual
        {
            get { return false; }
        }

        public bool IsHideBySig
        {
            get { return false; }
        }

        public bool IsAbstract
        {
            get { return false; }
        }

        public bool IsSpecialName
        {
            get { return false; }
        }

        public bool IsConstructor
        {
            get { return false; }
        }


        public static MethodBase GetMethodFromHandle(RuntimeMethodHandle handle)
        {
            return null;
        }

        public static MethodBase GetMethodFromHandle(RuntimeMethodHandle handle, RuntimeTypeHandle declaringType)
        {
            return null;
        }

        public static MethodBase GetCurrentMethod()
        {
            return null;
        }

        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        protected MethodBase()
        {
        }

        public static bool operator ==(MethodBase left, MethodBase right)
        {
            return false;
        }

        public static bool operator !=(MethodBase left, MethodBase right)
        {
            return !(left == right);
        }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        internal virtual ParameterInfo[] GetParametersNoCopy()
        {
            return this.GetParameters();
        }

        public abstract ParameterInfo[] GetParameters();

        public abstract MethodImplAttributes GetMethodImplementationFlags();

        public abstract object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture);

        public virtual Type[] GetGenericArguments()
        {
            return null;
        }

        public object Invoke(object obj, object[] parameters)
        {
            return null;
        }

        public virtual MethodBody GetMethodBody()
        {
            return null;
        }
    }
}
